import sys,os
sys.path.append(os.pardir)
import numpy as np
from common.functions import softmax,cross_entropy_error
from common.gradient import numerical_gradient

# 简单一层神经网络实现
class simpleNet:
    def __init__(self):
        self.W = np.random.randn(2,3)  # 用高斯分布进行初始化

    def predict(self, x):
        return np.dot(x, self.W)


    # t为实际的目标值
    def loss(self,x,t):
        z = self.predict(x)
        y = softmax(z)
        loss = cross_entropy_error(y,t)
        return loss




# 神经网络的梯度
if __name__ == '__main__':
    net = simpleNet()
    print(f'net的权重矩阵为：\n{net.W}')



    x  = np.array([0.6,0.9])
    p=net.predict(x)
    print(f'predict:\n',p)
    # 正确解标签
    t  =np.array([0,0,1])

    # 这里定义的参数W是一个伪参数,实际执行过程中，并不发生实际作用。
    # 输入x1,x2...t,权重参数矩阵W的元素，逐个发生变化，计算损失函数，然后计算梯度，
    # 等价于 f = lambda W: net.loss(x, t)
    def f(W):
        return net.loss(x, t)

    dw = numerical_gradient(f,net.W)

    print(f'dw:\n{dw}')